package main

import (
	"fmt"
	"reflect"
)

// 通过反射进行修改
func reflect01(b interface{}) {
	// 获取到 reflect.Value
	rVal := reflect.ValueOf(b)
	// rVal 的 Kind
	fmt.Printf("rVal kind=%v\n", rVal.Kind())
	// Elem 返回 v 持有的接口保管的值的 Value 封装，或者 v 持有的指针指向的值的 Value 封装
	rVal.Elem().SetInt(20)
}

//func main() {
//	var num int = 10
//	reflect01(&num)
//	fmt.Println("num=", num) // 20
//
//	//你可以这样理解rVal.Elem()
//	// num := 9
//	// ptr *int = &num
//	// num2 := *ptr  //=== 类似 rVal.Elem()
//}

func main() {
	var num int = 10
	fn := reflect.ValueOf(&num)
	// 该语句类似下面 3 句话
	fn.Elem().SetInt(200)
	//var num = 10
	//var b *int = &num
	//*b = 200
	fmt.Printf("%v\n", num)
}
